home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 4.iso / public / rayshade / libshade / symtab.c < prev    next >
C/C++ Source or Header  |  1994-08-01  |  4KB  |  153 lines

  1. /*
  2.  * symtab.c
  3.  *
  4.  * Copyright (C) 1989, 1991, Craig E. Kolb, Rod G. Bogart
  5.  * All rights reserved.
  6.  *
  7.  * This software may be freely copied, modified, and redistributed
  8.  * provided that this copyright notice is preserved on all copies.
  9.  *
  10.  * You may not distribute this software, in whole or in part, as part of
  11.  * any commercial product without the express consent of the authors.
  12.  * 
  13.  * There is no warranty or other guarantee of fitness of this software
  14.  * for any purpose.  It is provided solely "as is".
  15.  *
  16.  * $Id: symtab.c,v 4.0.1.1 91/10/05 18:24:29 cek Exp Locker: cek $
  17.  *
  18.  * $Log:    symtab.c,v $
  19.  * Revision 4.0.1.1  91/10/05  18:24:29  cek
  20.  * patch1: Added casts for builtin functions.
  21.  * 
  22.  * Revision 4.0  91/07/17  14:48:02  kolb
  23.  * Initial version.
  24.  * 
  25.  */
  26.  
  27. #include "rayshade.h"
  28. #include "symtab.h"
  29. #include "builtin.h"
  30.  
  31. static struct SymtabPredefinedEntry SymtabPredefined[] = {
  32.     {"pi", 3.141592, NULL, FLOAT_EXPR, FALSE, 0},
  33.     {"dtor", 0.017453, NULL, FLOAT_EXPR, FALSE, 0},
  34.     {"rtod", 57.29578, NULL, FLOAT_EXPR, FALSE, 0},
  35.     {"cos", 0.0, (Float (*)())cos, BUILTIN_EXPR, FALSE, 1},
  36.     {"sin", 0.0, (Float (*)())sin, BUILTIN_EXPR, FALSE, 1},
  37.     {"tan", 0.0, (Float (*)())tan, BUILTIN_EXPR, FALSE, 1},
  38.     {"sqrt", 0.0, (Float (*)())sqrt, BUILTIN_EXPR, FALSE, 1},
  39.     {"acos", 0.0, (Float (*)())acos, BUILTIN_EXPR, FALSE, 1},
  40.     {"asin", 0.0, (Float (*)())asin, BUILTIN_EXPR, FALSE, 1},
  41.     {"atan", 0.0, (Float (*)())atan, BUILTIN_EXPR, FALSE, 1},
  42.     {"hypot", 0.0, (Float (*)())hypot, BUILTIN_EXPR, FALSE, 2},
  43.     {"time", 0.0, NULL, FLOAT_EXPR, TRUE, 0},
  44.     {"frame", 0.0, NULL, FLOAT_EXPR, TRUE, 0},
  45.     {"linear", 0.0, LinearTime, BUILTIN_EXPR, TRUE, 4},
  46.     {NULL, 0.0, NULL, 0, 0}
  47. };
  48.  
  49. SymtabEntry *Symtab = (SymtabEntry *) NULL;
  50.  
  51. void SymtabAddEntry();
  52.  
  53. void
  54. SymtabInit()
  55. {
  56.     int i;
  57.  
  58.     for(i=0; SymtabPredefined[i].name; i++) {
  59.         if (SymtabPredefined[i].type == BUILTIN_EXPR)
  60.             SymtabAddEntry(SymtabPredefined[i].name,
  61.                        SymtabPredefined[i].type,
  62.                        NULL,
  63.                        SymtabPredefined[i].fp,
  64.                     SymtabPredefined[i].timevary,    
  65.                        SymtabPredefined[i].params);
  66.         else
  67.             SymtabAddEntry(SymtabPredefined[i].name,
  68.                        SymtabPredefined[i].type,
  69.                        ExprFloatCreate(SymtabPredefined[i].f,
  70.                         SymtabPredefined[i].timevary),
  71.                        NULL, SymtabPredefined[i].timevary, 0);
  72.     }
  73.     TimeExpr = ExprFloatSymtabFind("time");
  74.     FrameExpr = ExprFloatSymtabFind("frame");
  75. }
  76.  
  77. void
  78. SymtabAddEntry(name, type, expr, fp, timevary, params)
  79. char *name;
  80. Expr *expr;
  81. Float (*fp)();
  82. int type, timevary, params;
  83. {
  84.     SymtabEntry *res;
  85.  
  86.     if (SymtabFind(name) != (SymtabEntry *)NULL)
  87.         RLerror(RL_ABORT, "Symbol %s redefined.\n", name);
  88.  
  89.     res = (SymtabEntry *) Malloc( sizeof(SymtabEntry));
  90.     res->name = strsave(name);
  91.     res->type = type;
  92.     res->timevary = timevary;
  93.     switch (type) {
  94.     case FLOAT_EXPR:
  95.         res->value.expr = expr;
  96.         expr->symtab = TRUE;
  97.         break;
  98.     case BUILTIN_EXPR:
  99.         res->value.fp = fp;
  100.         break;
  101.     default:
  102.         RLerror(RL_WARN,
  103.             "Type %d not implemented!!!",type);
  104.     }
  105.     res->params = params;
  106.     res->next = Symtab;
  107.     Symtab = res;
  108. }
  109.  
  110. SymtabEntry *
  111. SymtabFind(name)
  112. char *name;
  113. {
  114.     SymtabEntry *res;
  115.     for(res=Symtab; res; res=res->next) {
  116.         if (!strcmp(res->name,name))
  117.             return res;
  118.     }
  119.     /*error*/
  120.     return NULL;
  121. }
  122.  
  123. Expr *
  124. ExprFloatSymtabFind(name)
  125. char *name;
  126. {
  127.     SymtabEntry *res;
  128.  
  129.     if ((res = SymtabFind(name)) == NULL) 
  130.         RLerror(RL_PANIC,
  131.             "Symbol %s not defined!\n", name);
  132.     if (res->type != FLOAT_EXPR)
  133.         RLerror(RL_PANIC,
  134.             "Symbol %s is not a float expression!\n", name);
  135.     return res->value.expr;
  136. }
  137.  
  138.  
  139. SymtabEntry *
  140. SymtabBuiltinFind(name)
  141. char *name;
  142. {
  143.     SymtabEntry *res;
  144.  
  145.     if ((res = SymtabFind(name)) == NULL) 
  146.         RLerror(RL_PANIC,
  147.             "Symbol %s not defined!\n", name);
  148.     if (res->type != BUILTIN_EXPR)
  149.         RLerror(RL_PANIC,
  150.             "Symbol %s is not a built in function!\n", name);
  151.     return res;
  152. }
  153.